// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Author: wsfuyibing <682805@qq.com>
// Date: 2024-08-01

package src

import (
	"fmt"
	"gitee.com/go-libs/log"
	xl "xorm.io/xorm/log"
)

type logger struct {
	xl.DiscardLogger
	cfg *Database
	key string
}

// AfterSQL
// is a hook function that called when sql execute completed.
func (o *logger) AfterSQL(c xl.LogContext) {
	// Do nothing
	// if logger not enabled.
	if !*o.cfg.EnableLogger {
		return
	}

	// Logger
	// basic message.
	prefix := fmt.Sprintf(`%s="%s", db-name="%s"`, o.cfg.Driver, o.key, o.cfg.data)

	// Append
	// session id on logger.
	if *o.cfg.EnableSession {
		if s := c.Ctx.Value(xl.SessionIDKey); s != nil {
			prefix += fmt.Sprintf(`, db-sid="%s"`, s)
		}
	}

	// Logger
	// sql statement.
	if c.Args != nil && len(c.Args) > 0 {
		// With
		// arguments.
		log.Infofc(c.Ctx, `%s, db-cost-ms="%v", sql="%s", args: %v`, prefix, c.ExecuteTime.Milliseconds(), c.SQL, c.Args)
	} else {
		// Without
		// any argument.
		log.Infofc(c.Ctx, `%s, db-cost-ms="%v", sql="%s"`, prefix, c.ExecuteTime.Milliseconds(), c.SQL)
	}

	// Logger
	// error level message.
	if c.Err != nil {
		log.Errorfc(c.Ctx, fmt.Sprintf("%v", c.Err))
	}
}

func (o *logger) BeforeSQL(_ xl.LogContext) {}
func (o *logger) Level() xl.LogLevel        { return xl.LOG_INFO }
func (o *logger) SetLevel(_ xl.LogLevel)    {}
func (o *logger) IsShowSQL() bool           { return *o.cfg.EnableLogger }
